summaryrefslogtreecommitdiff
path: root/app/[lng]/partners/(partners)/document-list-ship/page.tsx
blob: 8b7f61e20e8e09bdb18685146cacd9cb90ae48a9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
// page.tsx (간단한 Promise 생성과 로그인 처리)
import * as React from "react"
import { type SearchParams } from "@/types/table"
import { getValidFilters } from "@/lib/data-table"
import { Skeleton } from "@/components/ui/skeleton"
import { DataTableSkeleton } from "@/components/data-table/data-table-skeleton"
import { Shell } from "@/components/shell"
import { searchParamsRfqsForVendorsCache } from "@/lib/rfqs/validations"
import { getServerSession } from "next-auth"
import { authOptions } from "@/app/api/auth/[...nextauth]/route"
import Link from "next/link"
import { Button } from "@/components/ui/button"
import { LogIn } from "lucide-react"
import { getUserVendorDocumentStats, getUserVendorDocuments } from "@/lib/vendor-document-list/enhanced-document-service"
import { UserVendorDocumentDisplay } from "@/components/ship-vendor-document/user-vendor-document-table-container"

interface IndexPageProps {
    searchParams: Promise<SearchParams>
}

export default async function IndexPage(props: IndexPageProps) {
    const searchParams = await props.searchParams
    const search = searchParamsRfqsForVendorsCache.parse(searchParams)
    const validFilters = getValidFilters(search.filters)

    // Get session
    const session = await getServerSession(authOptions)

    // Check if user is logged in
    if (!session || !session.user) {
        return (
            <Shell className="gap-6">
                <div className="flex items-center justify-between">
                    <div>
                        <h2 className="text-2xl font-bold tracking-tight">
                            Document Management
                        </h2>
                        <p className="text-muted-foreground">
                            소속 회사의 모든 도서/도면을 확인하고 관리합니다.
                        </p>
                    </div>
                </div>

                <div className="flex flex-col items-center justify-center py-12 text-center">
                    <div className="rounded-lg border border-dashed p-10 shadow-sm">
                        <h3 className="mb-2 text-xl font-semibold">로그인이 필요합니다</h3>
                        <p className="mb-6 text-muted-foreground">
                            문서를 확인하려면 먼저 로그인하세요.
                        </p>
                        <Button size="lg" asChild>
                            <Link href="/partners">
                                <LogIn className="mr-2 h-4 w-4" />
                                로그인하기
                            </Link>
                        </Button>
                    </div>
                </div>
            </Shell>
        )
    }

    // User is logged in, get user ID
    const requesterId = session.user.id ? Number(session.user.id) : null

    if (!requesterId) {
        return (
            <Shell className="gap-6">
                <div className="flex items-center justify-between">
                    <div>
                        <h2 className="text-2xl font-bold tracking-tight">
                        Document Management
                        </h2>
                    </div>
                </div>
                <div className="flex flex-col items-center justify-center py-12 text-center">
                    <div className="rounded-lg border border-dashed p-10 shadow-sm">
                        <h3 className="mb-2 text-xl font-semibold">계정 오류</h3>
                        <p className="mb-6 text-muted-foreground">
                            사용자 정보가 올바르게 설정되지 않았습니다. 관리자에게 문의하세요.
                        </p>
                    </div>
                </div>
            </Shell>
        )
    }

    // 검색 파라미터 정리
    const searchInput = {
        ...search,
        filters: validFilters,
    }

    // Promise 생성 (모든 데이터를 페이지에서 처리)
    const documentsPromise = getUserVendorDocuments(requesterId, searchInput)
    const statsPromise = getUserVendorDocumentStats(requesterId)
    
    // Promise.all로 감싸서 전달
    const allPromises = Promise.all([documentsPromise, statsPromise])

    return (
        <Shell className="gap-2">
            <div className="flex items-center justify-between space-y-2">
                <div>
                    <h2 className="text-2xl font-bold tracking-tight">
                        내 문서 관리
                    </h2>
                    <p className="text-muted-foreground">
                        소속 회사의 모든 계약 문서를 확인하고 관리합니다.
                    </p>
                </div>
            </div>

            <React.Suspense fallback={<Skeleton className="h-7 w-52" />}>
                {/* DateRangePicker can go here */}
            </React.Suspense>

            <React.Suspense
                fallback={
                    <DataTableSkeleton
                        columnCount={8}
                        searchableColumnCount={1}
                        filterableColumnCount={3}
                        cellWidths={["10rem", "30rem", "15rem", "15rem", "15rem", "15rem", "8rem", "8rem"]}
                        shrinkZero
                    />
                }
            >
                <UserVendorDocumentDisplay
                    allPromises={allPromises}
                />
            </React.Suspense>
        </Shell>
    )
}